package com.example.demo.service.impl;

import com.example.demo.bean.Order;

import java.util.concurrent.RecursiveTask;

public class ForkJoin extends RecursiveTask<Integer> {

    private static final Integer MAX = 5;

    // 子任务开始计算的值
    private Integer startValue;

    // 子任务结束计算的值
    private Integer endValue;

    private Order order;

    public ForkJoin(Integer startValue, Integer endValue, Order order) {
        this.startValue = startValue;
        this.endValue = endValue;
        this.order = order;
    }

    @Override
    protected Integer compute() {
        // 如果条件成立，说明这个任务所需要计算的数值分为足够小了
        // 可以正式进行累加计算了
        if (endValue - startValue < MAX) {
            System.out.println("开始计算的部分：startValue = " + startValue + ";endValue = " + endValue);


            Integer totalValue = 0;
            for (int index = this.startValue; index <= this.endValue; index++) {
                totalValue += index;
            }
            order.setAmount(totalValue);
            return totalValue;
        }
        // 否则再进行任务拆分，拆分成两个任务
        else {
            ForkJoin subTask1 = new ForkJoin(startValue, (startValue + endValue) / 2, order);
            ForkJoin subTask2 = new ForkJoin((startValue + endValue) / 2 + 1, endValue, order);
            invokeAll(subTask1, subTask2);
            return subTask1.join() + subTask2.join();
        }

    }


}
